// DemoDlg.h : 头文件
//

#pragma once

#include "DeviceList.h"
#include "GenICam/Defs.h"
#include "GenICam/Camera.h"
#include "GenICam/Frame.h"
#include "Infra/Thread.h"
#include "Infra/Timer.h"
#include "MessageQue.h"
#include "Render.h"
#include "Attribute.h"

// CDemoDlg 对话框
class CSingleDisplayDlg : public CDialog
{
// 构造
public:
	CSingleDisplayDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_DEMO_DIALOG };
	
protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
	
// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
	
private:
	
	// 拦截ESC和回车键，防止退出程序
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	
	// 连接结果的回调
	void OnConnect(Dahua::GenICam::ICameraPtr camera, bool ret);
	
	// 加载配置
	void LoadCfg();
	
	// 拉流线程
	void GrabFrameThreadProc(Dahua::Infra::CThreadLite& lite);
	
	// 显示线程
	void DisplayThreadProc(Dahua::Infra::CThreadLite& lite);

	//// 取流线程
	//void StreamRetrieveThreadPro(Dahua::Infra::CThreadLite& lite);

	// 使能按钮
	void EnableBtns(bool enable);

	// 统计定时器
	void OnFrameNbrStaticTimer(ULONG param);

	// 开始拉流
	bool StartStreamGrabbing();

	// 停止拉流
	bool StopStreamGrabbing();

	// 相应Edit窗口的回车键
	void OnEditCtrlModify(CWnd* wnd);
	
	// 初始化属性
	void InitAttributes();

	// 根据参数的可写属性更新参数控件状态
	void UpdateAttrStatus();

	// 弹出选择对话框，并且获取选择文件
	::CString GetSelectFile();

	// 保存配置
	void SaveCfgXml(::CString const& fileName, std::vector<XmlCfgItem>& vec);

	// 解析配置
	void GetCfgXml(::CString const& fileName, std::vector<XmlCfgItem>& vec);

	// 相机连接事件通知
	void OnConnectEvent(const Dahua::GenICam::SConnectArg& arg);

	void onGetFrame(const Dahua::GenICam::CFrame & frame);

	BOOL OpenConsole();

	void setDisplayFPS(int nFPS);
	bool isTimeToDisplay();
	
	FrameBufferSPtr getConvertedImage();
	void addConvertedImage(const FrameBufferSPtr& sptrConvertedImage);

	bool                                _connected;       // 连接标识
	CRender                             _render;          // 显示对象

	int                                 _frameCnt;        // 帧计数
	int                                 _maxFrameCnt;     // 播放的最大帧数
	bool                                _frameCtrl;       // 是否进行帧控制
	
	CDeviceList*                        _devListDlg;      // 设备列表窗口对象
	Dahua::GenICam::ICameraPtr          _currentCamera;   // 相机对象

	Dahua::GenICam::IStreamSourcePtr    _stream;          // 流对象
	bool								_isGrabbing;	  // 拉流标识
	bool								_bRunning;
	Dahua::Infra::CThreadLite           _displayThread;   // 显示线程
//	Dahua::Infra::CThreadLite           _streamRetrieveThread;	// 取流线程
	std::list<FrameBufferSPtr>			_displayQue;		// 显示队列
	Dahua::Infra::CMutex				m_mutexQue;		
	AttrCtrlMap                         _attrCtrlMap;     // 属性对象集合

	Dahua::Infra::CMutex				m_mxTime;
	int								    m_dDisplayInterval;         // 显示间隔
	uintmax_t							m_nFirstFrameTime;          // 第一帧的时间戳
	uintmax_t							m_nLastFrameTime;           // 上一帧的时间戳
	
	bool				m_bStopGrabbing;
public:
	afx_msg void OnBnClickedConnect();
	afx_msg void OnBnClickedBtnPlay();
	afx_msg void OnClose();
	afx_msg void OnNMCustomdrawSliderFramerate(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderExposuretime(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderGain(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderGama(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderLight(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderSharpness(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderHue(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderSaturation(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderRwhitebalance(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderGwhitebalance(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMCustomdrawSliderBwhitebalance(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnCbnSelchangeComboFormat();
	afx_msg void OnCbnSelchangeComboAutoexposure();
	afx_msg void OnCbnSelchangeComboExposuremode();
	afx_msg void OnCbnSelchangeComboAutogain();
	afx_msg void OnCbnSelchangeComboAutowhitebalance();
	afx_msg void OnCbnSelchangeComboPlaymode();
	afx_msg void OnBnClickedBtnHoritrans();
	afx_msg void OnBnClickedBtnVerttrans();
	afx_msg void OnBnClickedBtnSofttrigger();
	afx_msg void OnCbnSelchangeComboTriggermode();
	afx_msg void OnBnClickedBtnSavecfg();
	afx_msg void OnBnClickedBtnOpencfg();
	afx_msg void OnBnClickedBtnSavepic();
};
